#ifndef NATURALSORTCOMPARATOR_H
#define NATURALSORTCOMPARATOR_H

#include <QString>
#include <QList>
#include <QRegularExpression>

/**
 * NaturalSortComparator - 自然排序比较器
 *
 * 实现智能文件名排序，能够正确处理：
 * - 数字混合的文件名（"文件1", "文件2", "文件10"）
 * - 前导零保留（"文件01", "文件02", "文件10"）
 * - 中文、英文混合文件名
 * - 复杂的数字组合（"第2章-页面5"）
 *
 * 排序示例：
 * 输入：["文件-1", "文件-0", "文件-03", "文件-11"]
 * 输出：["文件-0", "文件-1", "文件-03", "文件-11"]
 */
class NaturalSortComparator
{
public:
    /**
     * 自然排序比较函数
     * @param a 第一个文件名
     * @param b 第二个文件名
     * @return true 如果 a 应该排在 b 前面
     */
    static bool naturalCompare(const QString& a, const QString& b);

    /**
     * 排序索引列表（基于文件名）
     * @param filenames 文件名列表
     * @param indices 要排序的索引列表
     * @return 排序后的索引列表
     */
    static QList<int> sortIndices(const QStringList& filenames, const QList<int>& indices);

    /**
     * 反向排序索引列表
     * @param indices 要反向排序的索引列表
     * @return 反向排序后的索引列表
     */
    static QList<int> reverseIndices(const QList<int>& indices);

private:
    /**
     * 排序标记结构体
     */
    struct SortToken {
        enum Type { Text, Number };
        Type type;
        QString text;           // 原始文本（保留前导零等格式）
        qint64 number;          // 数字值（用于数值比较）
        int leadingZeros;       // 前导零个数

        SortToken(Type t, const QString& txt, qint64 num = 0, int zeros = 0)
            : type(t), text(txt), number(num), leadingZeros(zeros) {}
    };

    /**
     * 将文件名分解为排序标记列表
     * @param filename 文件名
     * @return 标记列表
     */
    static QList<SortToken> tokenize(const QString& filename);

    /**
     * 比较两个标记
     * @param a 第一个标记
     * @param b 第二个标记
     * @return 比较结果（-1: a<b, 0: a==b, 1: a>b）
     */
    static int compareTokens(const SortToken& a, const SortToken& b);

    /**
     * 提取数字信息（包括前导零）
     * @param numberText 数字文本
     * @param number 输出数字值
     * @param leadingZeros 输出前导零个数
     */
    static void extractNumberInfo(const QString& numberText, qint64& number, int& leadingZeros);
};

#endif // NATURALSORTCOMPARATOR_H